package exception;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Objects;

/**
   A:异常处理的两种方式
       a:try…catch…finally  :处理异常
           try catch
           try catch finally
           try finally
       b:throws及throw      :抛出异常
            throw : throw new xxxException("异常产生的原因");
            throws: 定义功能方法时,需要把出现的问题暴露出来让调用者去处理;那么就通过throws在方法上标识。

       try:用来检测异常;
       catch:用来捕获异常;
       finally:释放资源
 */
public class Demo02Throw {
    public static void main(String[] args) {

        /*---throw演示-------------*/
        int[] arr = null;
        int e =  getThrow(arr,1);  //空指针异常
//        int[] arr = new int[3];
//        int e = getThrow(arr,3);   //数组越界异常
        System.out.println(e);


        /*---throws演示-------------*/
        /*
        调用了一个声明抛出异常的方法,我们就必须的处理声明的异常
         1.要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM处理(中断停止)
         2.要么try...catch自己处理异常
        */
        try {
            readFile("c:\\a.tx");
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    }

    private static void readFile(String fileName) throws FileNotFoundException,IOException {
        if(!fileName.equals("c:\\a.txt")){
            throw new FileNotFoundException("传递的文件路径不是c:\\a.txt");
        }

        if(!fileName.endsWith(".txt")){
            throw new IOException("文件的后缀名不对");
        }
    }

    /*
        定义一个方法,获取数组指定索引处的元素
        如果参数不合法,那么我们就必须使用抛出异常的方式,告知方法的调用者,传递的参数有问题
        注意:
            NullPointerException是一个运行期异常,我们不用处理,默认交给JVM处理
            ArrayIndexOutOfBoundsException是一个运行期异常,我们不用处理,默认交给JVM处理
     */
    public static int getThrow(int[] arr,int index){

        // 1.如果数组arr的值是null,那么我们就抛出空指针异常,告知方法的调用者"传递的数组的值是null"
        if(arr == null) throw new NullPointerException("传递的数组的值是null");

        //2.Obects类中的静态方法判断空指针异常
//        Objects.requireNonNull(arr);
        Objects.requireNonNull(arr,"传递的对象的值是null");


        //如果index不在数组的索引范围内,我们就抛出越界异常,告知方法的调用者"传递的索引超出了数组的使用范围"
        if(index<0 || index>arr.length-1) throw new ArrayIndexOutOfBoundsException("传递的索引超出了数组的使用范围");

        int ele = arr[index];
        return ele;
    }




}
